package gfdclient;
import javax.swing.JComboBox;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Vector;
import java.util.ListIterator;

/**
 * Компонент для реорганизации и хранения кодировок.
 * @author Truewar Ashman (<a href="mailto:truewar@hotmail.ru">truewar@hotmail.ru</a>) ID = 2009
 * @author Tielvar ID = 1004
 * @version 0.3
 * 0.1 - создание базового функционала. (TrueWar, Tielvar)
 * 0.2 - изминение файла настроек. (TrueWar, Tielvar)
 * 0.3 - выделение отдельного класса настроек, кардинальные изменения класса. (TrueWar)
 */
public class JEncodingComboBox extends JComboBox
{
	public class Bound
	{
		String encd;
		String extn;

		public Bound(String encd, String extn)
		{
			this.encd = encd;
			this.extn = extn;
		}

	}
	/**
	  * Вектор, содержащий информацию о кодировках и связанных с ними
	  * расширениях.
      */
	private Vector <Bound> bounds;
	/**
	 * Экземпляр класса настроек.
	 * @see Settings
	 */
	public Settings set;
	/**
	 * Набор названий кодировок.
	 */
	private Vector <String> encdList;
	/**
	 * Конструктор класса.<br>
	 * Инициализация начальных данных и загрузка файла настроек.
	 */
	JEncodingComboBox()
	{
		bounds		= new Vector <Bound>  ();
		encdList	= new Vector <String> ();
		set = new Settings("settings.ini");
		set.loadFile();
	}

	/**
	 * Получение списка кодировок.
	 */
	public void getEncodings()
	{
		try
		{
			String tmp = set.getField("encodings");
			tmp = tmp.replaceAll(" ", "");
			tmp = tmp.replaceAll("\t", "");

			String t[] = tmp.split(",");
			int i = 0;
			while(i < t.length)
			{
				encdList.add(t[i]);
				String ext = set.getField(t[i]);
				ext = ext.replaceAll(" ", "");
				ext = ext.replaceAll("\t", "");
				bounds.add(new Bound(t[i], ext));
				i++;
			}
			set.fileName = "newSettings.ini";
		} catch(Exception e)
		{
			System.out.println("Ошибка в файле настроек. Нет поля \"encodings\"");
		}
	}

	/**
	 * Изменение кодировки для расширения
	 * @param encoding название кодировки на которую будет зарегистрировано
	 * расширение.
	 * @param extension расширение.
	 * @return  true, если было произведено обновление настроек,
	 *			false, в случае если указанной кодировки не существует.
	 */
	public boolean changeEncoding(String encoding, String extension)
	{
		int i = 0;
		boolean flag = false;
		while(i < bounds.size())
		{
			// Удаление расширения из других списков кодировок.
			bounds.get(i).extn = bounds.get(i).extn.replace(","+extension, "");
			bounds.get(i).extn = bounds.get(i).extn.replace(extension, "");
			if(bounds.get(i).encd.compareTo(encoding) == 0)
			{
				flag = true;
				bounds.get(i).extn += "," + extension;
			}

			// Удаление лишних ","
			if(bounds.get(i).extn.length() == 0)
			{
				i++;
				continue;
			}
			if(bounds.get(i).extn.charAt(0) == ',')
			{
				char tmp[] = new char[512];
				bounds.get(i).extn.getChars(1, bounds.get(i).extn.length(), tmp, 0);
				bounds.get(i).extn = String.copyValueOf(tmp, 0, bounds.get(i).extn.length() - 1);
			}
			if(bounds.get(i).extn.length() == 0)
			{
				i++;
				continue;
			}
			if(bounds.get(i).extn.charAt(bounds.get(i).extn.length()-1) == ',')
			{
				char tmp[] = new char[512];
				bounds.get(i).extn.getChars(0, bounds.get(i).extn.length()-1, tmp, 0);
				bounds.get(i).extn = String.copyValueOf(tmp, 0, bounds.get(i).extn.length() - 1);
			}
			i++;
		}
		if(flag == true)
			refreshSettings();
		return flag;
	}

	/**
	 * Печать списка кодировок.
	 */
	public void printEncodingsToConsole()
	{
		int i = 0;
		while(i < bounds.size())
		{
			System.out.println(bounds.get(i).encd + ": " + bounds.get(i).extn);
			i++;
		}
	}

	/**
	 * Обновление класса настроек.
	 */
	private void refreshSettings()
	{
		int i = 0;
		while(i < bounds.size())
		{
			set.addField(bounds.get(i).encd, bounds.get(i).extn);
			i++;
		}
	}

	/**
	 * Сохранение настроек в файл.
	 */
	public void saveSettingsToFile()
	{
		set.saveFile();
	}

	/**
	 * Обновление содержимого компонента.
	 */
	public void updateGUIList()
	{
		this.removeAllItems();
		int i = 0;
		while(i < encdList.size())
		{
			this.addItem(encdList.get(i));
			i++;
		}
	}

	/**
	 * Установка на указанный элемент выпадающего списка.
	 * @param encd текущая кодировка.
	 * @return true, в случае успешного выбора кодировки, иначе - false
	 */
	public boolean setSelectedIndex(String encd)
	{
		int i = 0;
		while(i < bounds.size())
		{
			if(bounds.get(i).encd.compareTo(encd) == 0)
			{
				this.setEnabled(false);
				this.setSelectedIndex(i);
				this.setEnabled(true);
				return true;
			}
			i++;
		}

		return false;
	}

	public String getEncodingByExtension(String extn)
	{
		int i = 0;
		while(i < bounds.size())
		{
			if(bounds.get(i).extn.contains(extn) == true)
			{
				return bounds.get(i).encd;
			}
			i++;
		}

		return null;
	}
}
